package com.example.mysql.学习笔记.基础.各种数据类型;

public class 浮点类型和定点数 {
}
/**
 *浮点类型
 * - FLOAT 表示单精度浮点数；     4字节
 * - DOUBLE 表示双精度浮点数；    8字节
 * - REAL默认就是 DOUBLE。
 *      如果你把 SQL 模式设定为启用“`REAL_AS_FLOAT`”，
 *      那 么，MySQL 就认为 REAL 是 FLOAT。如果要启用“REAL_AS_FLOAT”，
 *      可以通过以下 SQL 语句实现：  SET sql_mode = “REAL_AS_FLOAT”;
 *
 *  MySQL存储浮点数的格式为:符号(S)、 尾数(M) 和阶码(E)。
 *  因此，无论有没有符号，MySQL 的浮点数都会存储表示符号的部分。
 *  因此，所谓的无符号数取值范围，其实就是有符号数取值范围大于等于零的部分。
 *
 *  FLOAT(M,D)  这种方式  mysql特有
 *      M称为精度，D称为标度。(M,D)中 M=整数位+小数位，D=小数位。
 *      D<=M<=255，0<=D<=30。
 *      如果  小数位存在大于D 会自动四舍五入  但是正数多了 就直接报错
 *
 *  在编程中，如果用到浮点数,要特别注意误差问题，
 *  因为浮点数是不准确的，所以我们要避免使用“=”来判断两个数是否相等。
 *  同时,在-些对精确度要求较高的项目中，千万不要使用浮点数,
 *  不然会导致结果错误，甚至是造成不可挽回的损失。
 *  那么，MySQL 有没有精准的数据类型呢?
 *      当然有,这就是定点数类型: DECIMAL
 *
 */

/**
 * 定点数
 * DECIMAL
 * 使用DECIMAL(M,D)的方式表示高精度小数。
 * 其中, M被称为精度, D被称为标度。 0<=M<=65, 0<=D<=30, .
 * D<M。例如，定义DECIMAL (5,2) 的类型，表示该列取值范围是-999.99~999.99
 *
 *
 * ●DECIMAL(M,D)的最大取值范围与DOUBLE类型-样,但是有效的数据范围是由M和D决定的。
 *   DECIMAL 的存储空间并不是固定的，由精度值M决定，总共占用的存储空间为M+2个字节。
 *   也就是说，在-些对精度要求不高的场景下，比起占用同样字节长度的定点数,
 *   浮点数表达的数值范围可以更大一些。
 * ●定点数在MySQL内部是以字符串的形式进行存储,这就决定了它一定是精准的。
 * ●当DECIMAL类型不指定精度和标度时，其默认为DECIMAL(10,0)。
 *  当数据的精度超出了定点数类型的精度范围时，则MySQL同样会进行四舍五入处理。
 *
 * 。浮点数相对于定点数的优点是在长度一定的情况下，浮点类型取值范围大,但是不精准，
 *   适用于需要取值范围大，又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学等)
 * 。定点数类型取值范围相对小，但是精准，没有误差，
 *   适合于对精度要求极高的场景(比如涉及 金额计算的场景)
 */


